home *** CD-ROM | disk | FTP | other *** search
- unit app1main;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls;
-
- type
- TMyForm = class(TForm)
- Button1: TButton;
- Button2: TButton;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure Button1Click(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- procedure TurnSubClassOn;
- public
- { Public declarations }
- end;
-
- var
- MyForm: TMyForm;
-
- function NewFormFunction(handle: hWnd; msg, wParam : Word; lParam : LongInt): LongInt; stdcall;
- function AlternateNewFormFunction(handle: hWnd; msg, wParam : Word; lParam : LongInt): LongInt; stdcall;
-
-
- var
- NewWindowProc : TFarProc; {pointer to our window function}
- OldWindowProcAddr : LongInt; {previous window function (LongInt) }
- TargetHandle : hWnd;
-
- implementation
-
- {$R *.DFM}
-
- function NewFormFunction(handle: hWnd; msg, wParam : Word; lParam : LongInt): LongInt;
- begin
- case msg of
- WM_LBUTTONDOWN : MyForm.color := clLime;
- WM_RBUTTONDOWN : MyForm.color := clWhite;
- end;
- Result := CallWindowProc(TfarProc(OldWindowProcAddr), Handle, Msg, wParam, lParam);
- end;
-
- function AlternateNewFormFunction(handle: hWnd; msg, wParam : Word; lParam : LongInt): LongInt;
- begin
- Result := CallWindowProc(TfarProc(OldWindowProcAddr), Handle, Msg, wParam, lParam);
- case msg of
- WM_LBUTTONDOWN : MyForm.color := clLime;
- WM_RBUTTONDOWN : MyForm.color := clWhite;
- end;
- end;
-
- Procedure tmyForm.TurnSubClassOn;
- begin
- TargetHandle := handle;
- OldWindowProcAddr := GetWindowLong(TargetHandle, GWL_WNDPROC);
- NewWindowProc := @NewFormFunction;
- SetWindowLong(TargetHandle, GWL_WNDPROC, LongInt(NewWindowProc));
- end;
-
-
- procedure TMyForm.FormCreate(Sender: TObject);
- begin
- TurnSubClassOn;
- OnMouseDown := nil;
- end;
-
- procedure TMyForm.FormDestroy(Sender: TObject);
- begin
- SetWindowLong(TargetHandle, GWL_WNDPROC, OldWindowProcAddr);
- end;
-
- procedure TMyForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- if button = mbLeft then color := clYellow;
- if button = mbRight then color := clRed;
- end;
-
- procedure TMyForm.Button1Click(Sender: TObject);
- begin
- if not assigned(OnMouseDown)
- then begin
- OnMouseDown := FormMouseDown;
- button1.caption := 'MouseDown Event Enabled';
- end
- else begin
- OnMouseDown := nil;
- button1.caption := 'MouseDown Event Disabled';
- end;
- end;
-
- procedure TMyForm.Button2Click(Sender: TObject);
- begin
- SetWindowLong(TargetHandle, GWL_WNDPROC, OldWindowProcAddr);
- TargetHandle := handle;
- OldWindowProcAddr := GetWindowLong(TargetHandle, GWL_WNDPROC);
- NewWindowProc := @AlternateNewFormFunction;
- SetWindowLong(TargetHandle, GWL_WNDPROC, LongInt(NewWindowProc));
- end;
-
- end.
-